package br.com.sgi.model;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Size;

import br.com.sgi.util.ICombobox;

import com.sun.istack.NotNull;


@Entity
@Table(name="IGREJA")
@NamedQueries({
@NamedQuery(
	    name="buscarIgrejaPorCoSistema",
	    query="SELECT i FROM Igreja i " +
	    	  "WHERE i.sistema.coSeqSistema =:coSistema"),
  @NamedQuery(
		    name="buscarIgrejaPorCoSistSemIgrPertence",
	    query="SELECT i FROM Igreja i " +
	    	  " WHERE i.sistema.coSeqSistema =:coSistema" +
	    	  " AND i.coSeqIgreja <>:coIgreja"),
	    	  
@NamedQuery(
	    name="buscarIgrejaPorId",
	    query=" SELECT i FROM Igreja i " +
	    	  " WHERE i.sistema.coSeqSistema =:coSistema" +
	    	  " AND i.coSeqIgreja = :coSeqIgreja" ),
  @NamedQuery(
		    name="buscarIgrejaPorUsers",
		    query=" SELECT i FROM Igreja i " +
		    	  " WHERE i.sistema.coSeqSistema =:coSistema" +
		    	  " AND (i.coSeqIgreja = :coIgreja " +
		    	  " or i.coSeqIgreja in (SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username) )" )
})
public class Igreja implements ICombobox  {

	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq_igreja_seqigreja")  
	@SequenceGenerator(name = "seq_igreja_seqigreja", sequenceName = "SGI.seq_igreja") 
	@Column(name="CO_SEQ_IGREJA")
	private Long coSeqIgreja;
	
	@Size(max=100)
	private String nome;
	
	@Size(max=100)
	private String logradouro;
	
	private Integer numero;
	
	@Size(max=100)
	private String bairro;
	
	@Size(max=60)
	private String cidade;
			
	@Size(max=2)
	private String uf;
	
	@Size(max=25)
	private String cep;
	
	@Size(max=25)
	private String telefone;
	
	private String cnpj;
	
	@NotNull
	@ManyToOne
	@JoinColumn(name="CO_SEQ_SISTEMA")
	private Sistema sistema;
	
	@Column(name="TIPO_IGREJA")
	@Size(max=2)
	private String tipoIgreja;
	
	@Size(max=2)
	private String situacao;
	
	@Size(max=30)
	private String celular;
	
	@Size(max=30)
	@Column(name="SG_TELEFONE")
	private String segundoTelefone;
	
	@Column(name="DT_INAUGURACAO")	
	private Date dtInauguracao;
	
	@Size(max=200)
	private String email;
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = {
			javax.persistence.CascadeType.PERSIST,
			javax.persistence.CascadeType.MERGE })
	@JoinTable(name = "RL_AGENDA_IGREJA", joinColumns = { @JoinColumn(name = "CO_IGREJA", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "CO_AGENDA", nullable = false, updatable = false) })
	private List<Agenda> agendas;
	
	@Transient
	private String codigo;
	
	@Transient
	private boolean selecionado;
	
	@Transient
	private boolean desabilitado;
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

	public Integer getNumero() {
		return numero;
	}

	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getTipoIgreja() {
		return tipoIgreja;
	}

	public void setTipoIgreja(String tipoIgreja) {
		this.tipoIgreja = tipoIgreja;
	}

	public Long getCoSeqIgreja() {
		return coSeqIgreja;
	}

	public void setCoSeqIgreja(Long coSeqIgreja) {
		this.coSeqIgreja = coSeqIgreja;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	
	/*
	    * (non-Javadoc)
	    * @see java.lang.Object#equals(java.lang.Object)
	    */
	   @Override
	   public boolean equals(Object obj)
	   {
	      boolean retorno = false;
	      if (obj instanceof Igreja)
	      {
	         retorno = ((Igreja) obj).getCoSeqIgreja().equals(this.getCoSeqIgreja());
	      }
	      return retorno;
	   }
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((coSeqIgreja == null) ? 0 : coSeqIgreja.hashCode());
		return result;
	}

	public String getSituacao() {
		return situacao;
	}

	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}

	public Date getDtInauguracao() {
		return dtInauguracao;
	}

	public void setDtInauguracao(Date dtInauguracao) {
		this.dtInauguracao = dtInauguracao;
	}

	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public String getSegundoTelefone() {
		return segundoTelefone;
	}

	public void setSegundoTelefone(String segundoTelefone) {
		this.segundoTelefone = segundoTelefone;
	}


	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	@Override
	public Object getValue() {
		
		return getNome();
	}

	public List<Agenda> getAgendas() {
		return agendas;
	}

	public void setAgendas(List<Agenda> agendas) {
		this.agendas = agendas;
	}

	public boolean isSelecionado() {
		return selecionado;
	}

	public void setSelecionado(boolean selecionado) {
		this.selecionado = selecionado;
	}

	public boolean isDesabilitado() {
		return desabilitado;
	}

	public void setDesabilitado(boolean desabilitado) {
		this.desabilitado = desabilitado;
	}

	
	
}
